package org.xxpay.service.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.xxpay.core.entity.UserLocale;

import java.util.List;
import java.util.Map;

/**
 * 用户语言偏好Mapper接口
 * 
 * @author xxpay
 */
@Mapper
public interface UserLocaleMapper extends BaseMapper<UserLocale> {

    /**
     * 根据用户ID和用户类型查询语言偏好
     * 
     * @param userId 用户ID
     * @param userType 用户类型
     * @return 语言偏好
     */
    @Select("SELECT locale FROM t_user_locale WHERE user_id = #{userId} AND user_type = #{userType}")
    String selectLocaleByUserIdAndType(@Param("userId") Long userId, @Param("userType") Byte userType);

    /**
     * 统计各语言的用户数量
     * 
     * @param userType 用户类型，为null时统计所有类型
     * @return 语言统计信息
     */
    @Select({
        "<script>",
        "SELECT locale, COUNT(*) as user_count FROM t_user_locale",
        "<if test='userType != null'>",
        "WHERE user_type = #{userType}",
        "</if>",
        "GROUP BY locale",
        "</script>"
    })
    List<Map<String, Object>> selectLocaleStatistics(@Param("userType") Byte userType);

    /**
     * 批量插入或更新用户语言偏好
     * 
     * @param userLocales 用户语言偏好列表
     * @return 影响行数
     */
    int batchInsertOrUpdate(@Param("list") List<UserLocale> userLocales);

    /**
     * 根据语言查询用户列表
     * 
     * @param locale 语言代码
     * @param userType 用户类型，为null时查询所有类型
     * @return 用户列表
     */
    @Select({
        "<script>",
        "SELECT user_id, user_type FROM t_user_locale WHERE locale = #{locale}",
        "<if test='userType != null'>",
        "AND user_type = #{userType}",
        "</if>",
        "</script>"
    })
    List<UserLocale> selectUsersByLocale(@Param("locale") String locale, @Param("userType") Byte userType);

    /**
     * 删除指定用户类型的所有语言偏好
     * 
     * @param userType 用户类型
     * @return 影响行数
     */
    @Select("DELETE FROM t_user_locale WHERE user_type = #{userType}")
    int deleteByUserType(@Param("userType") Byte userType);

    /**
     * 查询最近更新的语言偏好
     * 
     * @param limit 限制数量
     * @return 最近更新的语言偏好列表
     */
    @Select("SELECT * FROM t_user_locale ORDER BY update_time DESC LIMIT #{limit}")
    List<UserLocale> selectRecentUpdated(@Param("limit") int limit);
}
